//
//  CZUserViewModel.swift
//  项目框架
//
//  Created by yang on 16/2/29.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

import AFNetworking
class CZUserViewModel: NSObject {

    //swift里的单例
    static let shareInstance = CZUserViewModel()
    
    var model:CZUserModel?
    
    var access_token: String? {
    
        return model?.access_token
    }
    
    //定义一个属性判断是否登录
    var isLogin:Bool?{
        model = CZUserModel.readObject("info.aaaaa")

        return model?.access_token != nil ? true: false
    }
    override init() {
        
        model = CZUserModel.readObject("info.aaaaa")
    }
    
    //定义一个方法来获取token
    //定义2个闭包，一个成功一个失败
    func loadToken(code:String,success:()->(),failure:()->()){
        
        let afn = AFHTTPSessionManager()
        
        //修改afn接受的类型
        afn.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        //拼接参数
        //        请求参数
        //        必选	类型及范围	说明
        //        client_id	true	string	申请应用时分配的AppKey。
        //        client_secret	true	string	申请应用时分配的AppSecret。
        //        grant_type	true	string	请求的类型，填写authorization_code
        //
        //        grant_type为authorization_code时
        //        必选	类型及范围	说明
        //        code	true	string	调用authorize获得的code值。
        //        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        
        let params = [
            "client_id":App_KEY,
            "client_secret":App_SECRET,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":App_URL
            
        ]
        //最好打印一下参数方便查看哪里出现错误
        // 发送一个Post请求
        /*
        第一个参数: 请求网络的URL
        第二个参数: POST的参数
        第三个参数: 进度
        第四个参数: 成功的回调.其中 <#NSURLSessionDataTask?#> 我们不需要使用,可以采用 下划线(_) 来忽略*/
        afn.POST("https://api.weibo.com/oauth2/access_token", parameters: params, progress: nil, success: { (_, JSON) -> Void in
            
            print(JSON)
            /*
            Optional({
            "access_token" = "2.00TB2V3GjxjoGBcbc730ac43tQwj3C";
            "expires_in" = 157679999;
            "remind_in" = 157679999;
            uid = 5829345367;
            })
            */
            //字典转模型
            //let JSON:AnyObject 转换成[string:nsobject]
            
            //let dict = JSON as?[string:nsobject]
            
            if let Odict = JSON as? [String:NSObject]{
                //强制解包会崩溃
                
                let userModel = CZUserModel(dict: Odict)
                print(userModel)
                
                self.getPersonInfo(userModel, success: success, failure: failure)
            }
            
            }) { (_, error) -> Void in
                print("失败")
                
                failure()
        }
    }
    
    
    func getPersonInfo(userModel:CZUserModel,success:()->(),failure:()->()){
        
        let afn = AFHTTPSessionManager()
        
        //拼接参数
        /*
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        screen_name	false	string	需要查询的用户昵称。
        注意事项
        参数uid与screen_name二者必选其一，且只能选其一；
        */
        let params = ["access_token":userModel.access_token ?? "",
            "uid":userModel.uid ?? ""
        ]
        afn.GET("https://api.weibo.com/2/users/show.json", parameters: params, progress: nil
            , success: { (_, JSON) -> Void in
                
                if let dic = JSON as? [String: NSObject]{
                    // userModel.profile_image_url是 String类型的
                    // dic["profile_image_url"] 是NSObject
                    userModel.profile_image_url = dic["profile_image_url"] as? String
                    
                    userModel.screen_name = dic["screen_name"] as? String
                    
                    //把数据进行保存 -- 归档
                    /*
                    1.  NSUserDefault --偏好设置
                    2.  归档
                    3.  字典写入文件 dic.writeToFile(<#T##path: String##String#>, atomically: <#T##Bool#>)
                    4.  数据库 - sqlite
                    */
                    userModel.save("info.aaaaa")
                    
                    //成功的回调
                    success()
                }
                
            }) { (_, error) -> Void in
                
                //失败的回调
                failure()
        }
        
    }


}
